package fixmodel.combination;

import fixmodel.base.Quack;
import fixmodel.observable.Observable;
import fixmodel.observable.Observer;

import java.util.ArrayList;
import java.util.Iterator;


/**
 * 组合模式 组合模式允许我们像对待单个对象一样对待对象集合
 * 组合需要和叶节点元素一样 实现相同的接口.这里的"叶节点"就是Quack
 *
 * @author yaojianfeng
 */
public class Flock implements Quack {
    private Observable observable;


    private ArrayList<Quack> quacks = new ArrayList<>();

    public Flock() {
        observable = new Observable(this);
    }

    /**
     * .
     * 新增鸭子对象到Flock
     *
     * @param quack 叶节点
     */
    public void add(Quack quack) {
        quacks.add(quack);
    }

    /**
     * quack 只需要做好一件事儿即可  呱呱叫
     */
    @Override
    public void quack() {
        for (Quack next : quacks) {
            next.quack();
            notifyObservers();
        }
    }

    /**
     * 注册方法
     * 迭代注册 将每一个quack都注册进观察者
     * @param observer 被观察者
     */
    @Override
    public void registerObserver(Observer observer) {
        for (Quack next : quacks) {
            next.registerObserver(observer);
        }
    }

    /**
     * 通知观察者
     */
    @Override
    public void notifyObservers() {
        observable.notifyObservers();
    }
}
